﻿#define _CRT_SECURE_NO_WARNINGS
//作者：宋安康
#include<stdio.h>
#include<assert.h>

//memcpy 使⽤和模拟实现
//void * memcpy ( void * destination, const void * source, size_t num );
//如果source和destination有任何的重叠，复制的结果都是未定义的。
//不负责重叠的拷贝

//模拟实现
//重叠内容交给memmove
void* my_memcpy(void* dest , const void* src ,size_t num)   //不负责重叠的拷贝
{
	void* ret = dest;
	assert(dest && src);
	while (num--)
	{
		*(char*)dest = *(char*)src;
		//((char*)dest)++;
		//((char*)src)++;
		dest = (char*)dest + 1;
		src = (char*)src + 1;

	}
	return ret;
}
//int main() 
//{
//	int arr1[10] = {1,2,3,4,5,6,7,8,9,10};
//	int arr2[10] = {0};
//	my_memcpy(arr2, arr1+3, 5*sizeof(int));
//	for (int i = 0; i < 10; i++)
//	{
//		printf("%d ", arr2[i]);
//	}
//	return 0;
//}

//memmove 使⽤和模拟实现
//void * memmove ( void * destination, const void * source, size_t num );

void* my_memmove(void* dest, const void* src, size_t num)   //模拟实现
{
	void* ret = dest;
	assert(dest&&src);

	if (dest < src)
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			//((char*)dest)++;
			//((char*)src)++;
			dest = (char*)dest + 1;   //空指针不能直接加一
			src = (char*)src + 1;

		}
	}
	else
	{
		while (num--)
		{
			*((char*)dest+num) = *((char*)src+num);
		
		}
	}
	return ret;
}

//int main() 
//{
//	int arr1[10] = {1,2,3,4,5,6,7,8,9,10};
//	int arr2[10] = {0};
//	memmove(arr1+2, arr1, 5*sizeof(int));
//	for (int i = 0; i < 10; i++)
//	{
//		printf("%d ", arr1[i]);
//	}
//	return 0;
//}

// memset 函数的使⽤ ----内存设置
//void * memset ( void * ptr, int value, size_t num );
//int main() 
//{
//	char arr1[20] = "hello world";
//	memset(arr1, 'x', 5); //memset是⽤来设置内存的，将内存中的值以字节为单位设置成想要的内容。
//	printf("%s\n",arr1);
//	return 0;
//}

//int main()
//{
//	int arr1[20] = {0};
//	memset(arr1, 1,40); //结果不是1
//	printf("%s\n", arr1);
//	return 0;
//}

//memcmp 函数的使⽤
//int main() 
//{
//	int arr1[] = {1,2,3,4,5,6,7,8,9,10};
//	int arr2[] = {1,2,3,4,8,7,8};
//	int ret = memcmp(arr1,arr2,17);   //调试看内存
//	printf("%d\n",ret);
//	return 0;
//}

//int main() 
//{
//	int a = 10;
//	int b = 0x11223344;    //调试看内存
//	return 0;
//}
//⼤端（存储）模式：是指数据的低位字节内容保存在内存的⾼地址处，⽽数据的⾼位字节内容，保存在内存的低地址处。
//⼩端（存储）模式：是指数据的低位字节内容保存在内存的低地址处，⽽数据的⾼位字节内容，保存在内存的⾼地址处。

//写一个代码，来判断当前机器是大端还是小端
int check_sys() 
{
	int a = 1;
	return *(char*)&a;  //取出 a的地址，强制类型转换为char*后，解引用
}
int main() 
{
	//int a = 1;
	//int* p = (char*)& a;
	//if (*p== 1)
	//{
	//	printf("小端\n");
	//}
	//else
	//	printf("大端\n");
	int ret = check_sys();
	if (ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}